package org.monkey.request.plugin.config;

import java.util.ArrayList;
import java.util.List;
import org.monkey.request.plugin.entity.RequestInfo;
import org.monkey.request.plugin.service.RequestLogAfterHandler;
import org.monkey.request.plugin.service.RequestLogHandleContext;
import org.monkey.request.plugin.service.RequestLogPreHandler;

public class DefaultRequestLogHandleContext implements RequestLogHandleContext {
  private List<RequestLogPreHandler> requestLogPreHandlers;
  private List<RequestLogAfterHandler> requestLogAfterHandlers;
  @Override
  public RequestLogHandleContext addPreHandlerLast(RequestLogPreHandler requestLogPreHandler) {
    if(requestLogPreHandlers==null){
      requestLogPreHandlers = new ArrayList<>();
    }
    requestLogPreHandlers.add(requestLogPreHandler);
    return this;
  }

  @Override
  public RequestLogHandleContext addPreHandlerHead(RequestLogPreHandler requestLogPreHandler) {
    if(requestLogPreHandlers==null){
      requestLogPreHandlers = new ArrayList<>();
    }
    requestLogPreHandlers.add(0,requestLogPreHandler);
    return this;
  }

  @Override
  public RequestLogHandleContext addAfterHandlerLast(RequestLogAfterHandler requestLogAfterHandler) {
    if(requestLogAfterHandlers==null){
      requestLogAfterHandlers = new ArrayList<>();
    }
    requestLogAfterHandlers.add(requestLogAfterHandler);
    return this;
  }

  @Override
  public RequestLogHandleContext addAfterHandlerHead(RequestLogAfterHandler requestLogAfterHandler) {
    if(requestLogAfterHandlers==null){
      requestLogAfterHandlers = new ArrayList<>();
    }
    requestLogAfterHandlers.add(0,requestLogAfterHandler);
    return this;
  }

  @Override
  public void doPre(RequestInfo requestInfo) {
      for(RequestLogPreHandler requestLogPreHandler:requestLogPreHandlers){
        requestLogPreHandler.doPre(requestInfo);
      }
  }

  @Override
  public void doAfter(RequestInfo requestInfo) {
    for(RequestLogAfterHandler requestLogAfterHandler:requestLogAfterHandlers){
      requestLogAfterHandler.doAfter(requestInfo);
    }
  }
}
